//*************************************************************************************
// File:        GlobalTimer.cs
//*************************************************************************************
// Description: Static timer for debugging stats purposes
//*************************************************************************************
// Classes:     DebugTimer
//*************************************************************************************
// Author:      ManOguaR
//*************************************************************************************

using Xeralabs.Common.Platform;

namespace Xeralabs.Timers
{
    /// <summary>
    /// Static timer for debugging stats purposes
    /// </summary>
    public class DebugTimer
    {
        #region Locals
        protected static bool isUsingQPF;
        protected static long ticksPerSecond;
        protected static long lastElapsedTime;
        protected static long baseTime;
        #endregion

        private DebugTimer() { }   //NOT CREATABLE

        /// <summary>
        /// Constructor.
        /// </summary>
        static DebugTimer()
        {
            ticksPerSecond = 0;
            lastElapsedTime = 0;
            baseTime = 0;
#if x64
            isUsingQPF = Win64DllImporter.QueryPerformanceFrequency(ref ticksPerSecond);
#else
            isUsingQPF = Win32DllImporter.QueryPerformanceFrequency(ref ticksPerSecond);
#endif
            if (isUsingQPF)
            {
                long time = 0;
#if x64
                Win64DllImporter.QueryPerformanceCounter(ref time);
#else
                Win32DllImporter.QueryPerformanceCounter(ref time);
#endif
                baseTime = time;
                lastElapsedTime = time;
            }
        }

        /// <summary>
        /// Metodo para obtener el tiempo absoluto desde que se inicio el sistema, en segundos.
        /// </summary>
        /// <returns>
        /// El tiempo transcurrido desde que se inicio el sistema, en segundos.
        /// </returns>
        internal static double GetAbsoluteTime()
        {
            if (!isUsingQPF) return -1.0; //Nada que hacer

            //Obtener el tiempo actual o el de parada
            long time = 0;

#if x64
            Win64DllImporter.QueryPerformanceCounter(ref time);
#else
            Win32DllImporter.QueryPerformanceCounter(ref time);
#endif

            double absolueTime = time / (double)ticksPerSecond;
            return absolueTime;
        }

        /// <summary>
        /// Metodo para obtener el tiempo actual modificado segun paradas y avances, en segundos.
        /// </summary>
        /// <returns>
        /// El tiempo actual del temporizador, en segundos.
        /// </returns>
        internal static double GetTime()
        {
            if (!isUsingQPF) return -1.0; //Nada que hacer

            //Obtener el tiempo actual o el de parada
            long time = 0;
#if x64
            Win64DllImporter.QueryPerformanceCounter(ref time);
#else
            Win32DllImporter.QueryPerformanceCounter(ref time);
#endif

            double appTime = (double)(time - baseTime) / (double)ticksPerSecond;
            return appTime;
        }
        /// <summary>
        /// Metodo para obtener el tiempo transcurrido entre dos llamadas GetElapsedTime(), modificado segun paradas y
        /// avances, en segundos.
        /// </summary>
        /// <returns>
        /// El tiempo transcurrido desde la ultima llamada GetElapsedTime(), en segundos.
        /// </returns>
        public static double GetElapsedTime()
        {
            if (!isUsingQPF) return -1.0; //Nada que hacer

            //Obtener el tiempo actual o el de parada
            long time = 0;

#if x64
            Win64DllImporter.QueryPerformanceCounter(ref time);
#else
            Win32DllImporter.QueryPerformanceCounter(ref time);
#endif

            double elapsedTime = (double)(time - lastElapsedTime) / (double)ticksPerSecond;
            lastElapsedTime = time;
            return elapsedTime;
        }
    }
}
